/**
 * 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，
 * 如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
 * 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
 * 1 <= nums.length <= 100
 * 0 <= nums[i] <= 400
 */
#include<vector>
#include<math.h>
#include<iostream>
using namespace std;


/**
 * 动态规划
 * dp[i] 表示前 i 间房屋能偷窃到的最高总金额
 * 则dp[i] = max(nums[i]+dp[i-2], dp[i-1])
 * 边界条件： dp[0] = nums[0](只一个房间，就偷这个房间)
 *           dp[1] = max(dp[0], dp[1])
 */
class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.empty()){
            return 0;
        }
        int n = nums.size();
        vector<int> dp(n,0);

        if(n == 1){
            return nums[0];
        }

        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);

        for(int i=2; i<n; ++i){
            dp[i] = max(nums[i]+dp[i-2], dp[i-1]);
        }    

        return dp[n-1];
    }
};

// 空间优化，不用数组，用两个整型变量实现滚动数组
class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.empty()){
            return 0;
        }
        int n = nums.size();

        if(n == 1){
            return nums[0];
        }

        int dp0 = nums[0];
        int dp1 = max(nums[0], nums[1]);

        for(int i=2; i<n; ++i){
            int tmp = dp1;
            dp1 = max(nums[i]+dp0, dp1);
            dp0 = tmp;
        }    

        return dp1;
    }
};


int main(){
    vector<int> nums = {1};
    Solution s;
    int ans = s.rob(nums);
    cout<<ans;

}